package waitandnotify01;

public class Foodie extends Thread{
    public Foodie(String name){
        super(name);
    }

    @Override
    public void run() {
        /*
           1.循环
           2.同步代码块
           3.判断共享数据是否到了末尾(到了末尾)
           4.判断共享数据是否到了末尾(没有到末尾,执行核心逻辑)
        */
        // 1.循环
        while (true){
            // 2.同步代码块
            synchronized (Desk.lock){
                // 3.判断共享数据是否已经到了末尾(到了末尾)
                if (Desk.count == 0){
                    break;
                }else{
                    if (Desk.foodFlag == 0){
                        try {
                            // 如果没有,就等待
                            // 必须用锁对象去调用wait方法和notifyAll()方法
                            //  Desk.lock.notifyAll(); // 唤醒跟这把锁绑定的所有线程
                            Desk.lock.wait(); // 让当前线程跟锁进行绑定
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }else{
                        // 如果有,就开吃
                        // 把吃的总数 - 1
                        Desk.count--;
                        // 如果有,就开吃
                        System.out.println(getName() + "吃货在吃面条,还能再吃" + Desk.count + "碗");
                        // 吃完之后,唤醒厨师继续做
                        Desk.lock.notifyAll(); // 表示现在要去唤醒,绑定在这把锁上的所有线程
                        // 修改桌子的状态
                        Desk.foodFlag = 0;
                    }
                }
            }
        }
    }
}
